/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../config/head.h"
#include "../impl/head.h"
#include "helper_ssl.h"

namespace xos_http
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static xos_box::i_str_property * ssl_ctx_prop_ptr = 0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    helper_ssl::helper_ssl()
    {
    }

    helper_ssl::~helper_ssl()
    {
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int helper_ssl::load_cert( xos_encrypt::i_ssl_mgr *& pMgr, const char * lpszPath, bool bServer )
    {
        int ret = 0;

        xos_box::i_string * pStr = mgr::container()->box()->string();
        xos::i_misc * pMisc = mgr::container()->misc();
        const char * lpszFile = bServer ? "server" : "client";

        if( 0 == ret )
        {
            pMgr = mgr::container()->encrypt()->ssl();
        }
        if( 0 == ret )
        {
            pStr->set( lpszPath );
            pMisc->path_append( pStr, lpszFile );
            pStr->append( ".crt" );
            pMgr->set_cert( pStr->get(0,0) );
        }
        if( 0 == ret )
        {
            pStr->set( lpszPath );
            pMisc->path_append( pStr, lpszFile );
            pStr->append( ".key" );
            pMgr->set_key( pStr->get( 0, 0 ) );
        }
        if( 0 == ret )
        {
            ret = pMgr->init_ssl( bServer );
        }
        if( 0 != ret )
        {
            xos_stl::release_interface( pMgr );
        }

        xos_stl::release_interface( pStr );

        return ret;
    }

    int helper_ssl::add_ctx( const char * lpszDomain, xos_encrypt::i_ssl_mgr * pCtx )
    {
        int ret = 0;

        if( ( 0 == ret ) && ( config::get()->m_default_host == lpszDomain ) )
        {
            ret = 1;
        }

        if( 0 == ret )
        {
            xos::i_release * pU = ctx()->obj( lpszDomain );
            if( !pU )
            {
                ctx()->set_obj(lpszDomain, pCtx, false);
            }
        }

        return ret;
    }

    xos_box::i_str_property * helper_ssl::ctx()
    {
        return ssl_ctx_prop_ptr;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int helper_ssl::init()
    {
        int ret = 0;
        ssl_ctx_prop_ptr = mgr::container()->box()->get_str_prop();
        return ret;
    }

    int helper_ssl::term()
    {
        int ret = 0;
        xos_stl::release_interface( ssl_ctx_prop_ptr );
        return ret;
    }

} // xos_http
